/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: LIUYANJIAO
 * Date: 2024-12-05
 * Time: 17:36
 */
import java.util.*;

public class TopologicalSort {
    public static void main(String[] args) {
        // 课程名列表
        String[] courses = {
                "数字逻辑与计算机组成",
                "程序设计与问题求解",
                "离散数学",
                "高等数学",
                "概率论",
                "数据结构与算法",
                "计算机网络"
        };

        // 图的边表示课程的依赖关系 (u -> v 表示 u 是 v 的先修课程)
        int[][] prerequisites = {
                {3, 2}, // 高等数学 -> 离散数学
                {3, 4}, // 高等数学 -> 概率论
                {1, 5}, // 程序设计与问题求解 -> 数据结构与算法
                {2, 5}, // 离散数学 -> 数据结构与算法
                {5, 6}  // 数据结构与算法 -> 计算机网络
        };

        // 构建图
        int n = courses.length; // 节点数
        List<List<Integer>> graph = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            graph.add(new ArrayList<>());
        }
        int[] inDegree = new int[n]; // 入度数组

        for (int[] edge : prerequisites) {
            int u = edge[0];
            int v = edge[1];
            graph.get(u).add(v);
            inDegree[v]++;
        }

        // 拓扑排序
        List<Integer> result = new ArrayList<>();
        Queue<Integer> queue = new LinkedList<>();

        // 初始化队列，将入度为 0 的节点加入队列
        for (int i = 0; i < n; i++) {
            if (inDegree[i] == 0) {
                queue.offer(i);
            }
        }

        // BFS
        while (!queue.isEmpty()) {
            int course = queue.poll();
            result.add(course);

            for (int next : graph.get(course)) {
                inDegree[next]--;
                if (inDegree[next] == 0) {
                    queue.offer(next);
                }
            }
        }

        // 输出拓扑排序结果
        if (result.size() == n) {
            System.out.println("课程的学习顺序为：");
            for (int course : result) {
                System.out.println(courses[course]);
            }
        } else {
            System.out.println("图中存在环，无法进行拓扑排序！");
        }
    }
}